package cn.itsource.properties;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Properties;

/**
 *	Properties:
 *		1. 概念：就是一个特殊的HashTable，key和value都是String类型，常用来做配置文件
 *		2. 作用：
 *				解决了Java编程中的硬编码问题。
 *		3. 使用：
 *			3.1. 将内存中的数据，写出到硬盘
 *				void list(PrintStream out) 将此属性列表打印到指定的输出流。  
				void list(PrintWriter out) 将此属性列表打印到指定的输出流。  
 *
 *
 *			2. 将硬盘中的数据，读取到内存
 *				void load(InputStream inStream) 从输入字节流读取属性列表（键和元素对）。  
				void load(Reader reader) 以简单的线性格式从输入字符流读取属性列表（关键字和元素对）。 
 *
 *
 *

 *		4. 注意事项：
 *			
 */
public class PropertiesTest {

	public static void main(String[] args) {
		/*
		 * 构造方法：
		 * 	Properties() 创建一个没有默认值的空属性列表。  
			Properties(Properties defaults) 创建具有指定默认值的空属性列表。  
		 */
		Properties p = new Properties();
		System.out.println(p);
		
		//1. Object setProperty(String key, String value)  给配置文件对象中添加键值对，只能是String类型
		p.setProperty("uname", "admin");
		p.setProperty("pwd", "root");
		System.out.println(p);
		
		/*
		 * 2. 将内存中的数据，写出到硬盘
 *				void list(PrintStream out) 内存中的数据，写出到硬盘
 *	`				这里需要PrintStream对象，所以需要从API中找到构造方法(找最熟悉)
 *					PrintStream(String fileName) 使用指定的文件名创建新的打印流，无需自动换行。 
 *						fileName：文件名
 *							1. 绝对路径：是从盘符（Windows）或者根目录（Linux）开始的
 *							2. 相对路径：是从当前项目开始，保存到当前项目下
 *				
				void list(PrintWriter out) 
				使用IO流的时候，必须要记得关流： close();用finally
		 */
		PrintStream ps = null;//因为下面关流，所以必须保证ps能够在finally中访问到，所以要声明在try上面
		try {
			//创建一个PrintStream对象
			ps = new PrintStream("mysql.properties");//相对路径，在项目下面，要刷新项目的目录
			
			//将 PrintStream对象传入list方法
			p.list(ps);
			System.out.println("写出成功！");
		} catch (FileNotFoundException e) {
			System.out.println("写出失败！");
			e.printStackTrace();
		} finally {
			//必须关流ps,调用ps.close()，记得关流前，做非空判断
			if (ps != null) {
				ps.close();
			}
		}
		
	}

}
